package com.hzlj.position.locate.dao;

import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fz.common.base.converter.QueryWrapperConverterPlus;
import com.fz.common.base.core.db.function.IFUtil;
import com.fz.common.base.core.db.function.ToCharUtil;
import com.fz.common.base.core.db.function.ToNumberUtil;
import com.fz.common.base.dto.PageParamDTO;
import com.fz.common.base.dto.QueryPageResultDTO;
import com.hzlj.position.locate.common.dto.position.PositionHandleDTO;
import com.hzlj.position.locate.common.dto.position.PositionKeyDTO;
import com.hzlj.position.locate.common.dto.positionNewestEffective.PositionNewestEffectiveQueryParamDTO;
import com.hzlj.position.locate.common.dto.positionNewestEffective.PositionNewestEffectiveQueryResultDTO;
import com.hzlj.position.locate.common.dto.positionNewestEffective.PositionNewestEffectiveSimpleResultDTO;
import com.hzlj.position.locate.common.model.PositionNewestEffective;
import com.hzlj.position.locate.mapper.PositionNewestEffectiveMapper;
import com.hzlj.sqjz.jz.common.constant.JzJoin;
import com.hzlj.sqjz.jz.common.model.JzJbxx;
import org.springframework.stereotype.Repository;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 定位记录-最新有效位置(PositionNewestEffective)表操作类
 *
 * @author makejava
 * @date 2024-01-17 11:18:17
 */
@Repository
public class PositionNewestEffectiveDao extends ServiceImpl<PositionNewestEffectiveMapper, PositionNewestEffective> {
    @Resource
    private PositionNewestEffectiveMapper positionNewestEffectiveMapper;

    public PositionNewestEffectiveSimpleResultDTO getPositionNewestEffective(String jzId) {
        return QueryWrapperConverterPlus.of(positionNewestEffectiveMapper)
                .selectOne(PositionNewestEffectiveSimpleResultDTO.class, null, null, q -> q
                        .eq(PositionNewestEffective::getJzId, jzId)
                        .orderByDesc(PositionNewestEffective::getPositionTime));

    }

    public List<String> listJzIds(Date startTime, Date endTime) {
        return QueryWrapperConverterPlus.of(positionNewestEffectiveMapper)
                .list("distinct(jz_id) jz_id", String.class, null, null, q -> {
                    q.ge(PositionNewestEffective::getPositionTime, startTime)
                            .le(PositionNewestEffective::getPositionTime, endTime);
                });
    }

    public void handle(PositionHandleDTO dto) {
        if (!Boolean.TRUE.equals(dto.getNormal())) {
            return;
        }
        String warningType = ToCharUtil.format(ToNumberUtil.format("warning_type") + "+50");
        warningType = IFUtil.format("warning=1", warningType, "warning_type");
        LambdaUpdateWrapper<PositionNewestEffective> updateWrapper = new UpdateWrapper<PositionNewestEffective>().lambda()
                .setSql(Boolean.TRUE.equals(dto.getNormal()), "warning_type=" + warningType)
                .set(Boolean.TRUE.equals(dto.getNormal()), PositionNewestEffective::getWarning, false)
                .in(PositionNewestEffective::getPositionId, dto.getKeys().stream().map(PositionKeyDTO::getId).collect(Collectors.toList()));
        this.update(updateWrapper);
    }

    /**
     * 查询列表：不分页
     */
    public List<PositionNewestEffectiveQueryResultDTO> listPositionNewestEffective(PositionNewestEffectiveQueryParamDTO dto) {
        return QueryWrapperConverterPlus.of(positionNewestEffectiveMapper)
                .innerJoin(JzJbxx.class, JzJoin.zj(PositionNewestEffective::getJzId))
                .list(PositionNewestEffectiveQueryResultDTO.class, dto);
    }

    /**
     * 查询列表：分页
     */
    public QueryPageResultDTO<PositionNewestEffectiveQueryResultDTO> pagePositionNewestEffective(PositionNewestEffectiveQueryParamDTO dto, PageParamDTO page) {
        return QueryWrapperConverterPlus.of(positionNewestEffectiveMapper)
                .innerJoin(JzJbxx.class, JzJoin.zj(PositionNewestEffective::getJzId))
                .page(PositionNewestEffectiveQueryResultDTO.class, dto, page);
    }
}

